﻿#pragma once

#include <string>
#include <SFML/System.hpp>
#include "Piece.h"

/**
* Zawiera wszystkie klasy kart i ich kolekcje
*/
namespace Cards {
	/**
	* Bazowa klasa wszystkich rodzajów kart
	*/
	class Card
	{
	protected:
		sf::Unicode::Text title; /**< Tytuł karty, np. "Pani Bielicka" */
		sf::Unicode::Text description; /**< Opis karty (aktualnie nie wykorzystywany) */
		/**
		* Inicjalizuje atrybuty karty odpowiednimi wartościami
		* @param title Tytuł karty
		* @param description Słowny opis karty
		*/
		Card(sf::Unicode::Text title, sf::Unicode::Text description);

	public:
		/**
		* Abstrakcyjna funkcja zwracająca nazwę typu karty, np. "Broń"
		* @return Typ karty
		*/
		virtual sf::Unicode::Text getTypeName() = 0;
		/**
		* @return Tytuł karty
		*/
		sf::Unicode::Text getTitle();
	};

	/**
	* Karta postaci
	*/
	class PlayerCard: public Card
	{
		BoardItems::PlayerPiece* piece; /**< Pionek gracza */

	public:
		/**
		* Inicjalizuje atrybuty karty odpowiednimi wartościami
		* @param title Tytuł karty
		* @param description Słowny opis karty
		* @param piece Pionek gracza powiazany z kartą (np. czerwony pionek dla karty Panna czerwińska)
		*/
		PlayerCard(sf::Unicode::Text title, sf::Unicode::Text description, BoardItems::PlayerPiece* piece);
		virtual sf::Unicode::Text getTypeName();
		/**
		* @return Pionek powiązany z kartą 
		*/
		BoardItems::PlayerPiece* getPiece();
	};

	class WeaponCard: public Card
	{
		BoardItems::WeaponPiece* piece; /**< Pionek broni */

	public:
		/**
		* Inicjalizuje atrybuty karty odpowiednimi wartościami
		* @param title Tytuł karty
		* @param description Słowny opis karty
		* @param piece Pionek broni powiazany z kartą
		*/
		WeaponCard(sf::Unicode::Text title, sf::Unicode::Text description, BoardItems::WeaponPiece* piece);
		virtual sf::Unicode::Text getTypeName();
		/**
		* @return Pionek broni
		*/
		BoardItems::WeaponPiece* getPiece();
	};

	class RoomCard: public Card
	{
	public:
		BoardItems::Room* room; /**< Pokój powiązany z kartą */

		/**
		* Inicjalizuje atrybuty karty odpowiednimi wartościami
		* @param title Tytuł karty
		* @param description Słowny opis karty
		* @param room Pokój powiązany z kartą
		*/
		RoomCard(sf::Unicode::Text title, sf::Unicode::Text description, BoardItems::Room* room);
		virtual sf::Unicode::Text getTypeName();
	};
}

